/**    
 * 文件名：CompressPicUtil.java</br>
 *    
 * 版本信息：v1.0</br>
 * 日期：2017年7月17日</br>
 * © 2005-2017 雷技信息科技（上海）有限公司版权所有</br>
 *
 */
package com.logic.landseaserver.common.util;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * 项目名称：system-server</br>
 * 类名称：CompressPicUtil</br>
 * 类描述：图片压缩器</br>
 * 创建人：Aaron</br>
 * 创建时间：2017年7月17日 下午10:36:55</br>
 * 
 * @version 1.0
 *
 */
public abstract class CompressPicUtil
{
    private static final Logger LOG = LoggerFactory.getLogger(CompressPicUtil.class);
    
    /**
     * 
     * [简要描述]：压缩图片</br>
     * [详细描述]：通过降低图片像素来压缩图片，输出jpg</br>
     * [作者]：Aaron(2017-07-17)</br>
     *
     * @param srcFilePath 原图片绝对路径例如/opt/pic/1.jpg
     * @param descFilePath 压缩后图片绝对路径例如/opt/pic/2.jpg
     * @param compressionQuality 压缩质量0-1，例如0.1，数值越小，压缩后图片越小
     * @return true压缩成功，false压缩
     * @throws IOException
     *
     */
    public static boolean compress(String srcFilePath, String descFilePath, float compressionQuality)
    {
        
        try
        {
            File file = null;
            BufferedImage src = null;
            FileOutputStream out = null;
            ImageWriter imgWrier;
            ImageWriteParam imgWriteParams;
            
            // 指定写图片的方式为 jpg
            imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();
            imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
            // 要使用压缩，必须指定压缩方式为MODE_EXPLICIT
            imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            // 这里指定压缩的程度，参数qality是取值0~1范围内，
            imgWriteParams.setCompressionQuality(compressionQuality);
            imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
            ColorModel colorModel = ImageIO.read(new File(srcFilePath)).getColorModel();
            // ColorModel.getRGBdefault();
            // 指定压缩时使用的色彩模式
            // imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
            // colorModel, colorModel.createCompatibleSampleModel(16, 16)));
            imgWriteParams.setDestinationType(
                new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));
            if (isBlank(srcFilePath))
            {
                return false;
            }
            else
            {
                file = new File(srcFilePath);
                src = ImageIO.read(file);
                out = new FileOutputStream(descFilePath);
                
                imgWrier.reset();
                // 必须先指定 out值，才能调用write方法, ImageOutputStream可以通过任何
                // OutputStream构造
                imgWrier.setOutput(ImageIO.createImageOutputStream(out));
                // 调用write方法，就可以向输入流写图片
                imgWrier.write(null, new IIOImage(src, null, null), imgWriteParams);
                out.flush();
                out.close();
            }
        }
        catch (Exception e)
        {
            LOG.error("compress picture failed |srcFilePath=" + srcFilePath, e);
            return false;
        }
        return true;
    }
    
    public static boolean isBlank(String string)
    {
        if (string == null || string.length() == 0 || string.trim().equals(""))
        {
            return true;
        }
        return false;
    }
}
